/**
 * @file cartSlice.js
 * @description 购物车的 Redux slice，包含 reducer 和 actions。
 */
import { createSlice } from '@reduxjs/toolkit';

// 尝试从 localStorage 获取初始购物车状态
const getInitialCart = () => {
  try {
    const storedCart = localStorage.getItem('cart');
    return storedCart ? JSON.parse(storedCart) : [];
  } catch (error) {
    console.error("无法从localStorage解析购物车数据:", error);
    return [];
  }
};

const initialState = {
  items: getInitialCart(),
};

const cartSlice = createSlice({
  name: 'cart',
  initialState,
  reducers: {
    /**
     * 添加商品到购物车，或增加已存在商品的数量。
     * @param {object} state - 当前的 state。
     * @param {object} action - Redux action，action.payload 应该是要添加的商品对象。
     */
    addItem: (state, action) => {
      const productToAdd = action.payload;
      const existingItem = state.items.find((item) => item.id === productToAdd.id);

      if (existingItem) {
        existingItem.qty += 1;
      } else {
        state.items.push({ ...productToAdd, qty: 1 });
      }
      localStorage.setItem('cart', JSON.stringify(state.items));
    },
    /**
     * 从购物车移除商品，或减少已存在商品的数量。
     * @param {object} state - 当前的 state。
     * @param {object} action - Redux action，action.payload 应该是要移除的商品对象。
     */
    removeItem: (state, action) => {
      const productToRemove = action.payload;
      const existingItem = state.items.find((item) => item.id === productToRemove.id);

      if (existingItem) {
        if (existingItem.qty === 1) {
          state.items = state.items.filter((item) => item.id !== productToRemove.id);
        } else {
          existingItem.qty -= 1;
        }
        localStorage.setItem('cart', JSON.stringify(state.items));
      }
    },
    /**
     * 清空购物车。
     * @param {object} state - 当前的 state。
     */
    clearCart: (state) => { // 新增 clearCart reducer
      state.items = [];
      localStorage.setItem('cart', JSON.stringify(state.items)); // 同样更新 localStorage
    },
  },
});

// 将 clearCart action 添加到导出中
export const { addItem, removeItem, clearCart } = cartSlice.actions;
export default cartSlice.reducer;